package com.dong.ui.view;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.dong.common.pojo.ResultVO;
import com.dong.common.util.RequestUtils;
import com.dong.common.view.CommonView;
import com.dong.ui.component.CommonFrame;
import com.dong.ui.constant.RouterConst;
import com.dong.ui.util.ComponentUtils;
import com.dong.ui.util.FontUtils;
import com.dong.ui.util.MessageUtils;
import com.dong.ui.util.RouterUtils;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashMap;
import java.util.Map;

/**
 * @description:
 * @author: 陈瑞东
 * @create: 2021-08-26 09:44
 */
public class RegFrame extends CommonFrame implements CommonView {

    /*==================组件==================*/
    private static final int WIDTH = 520;
    private static final int HEIGHT = 400;

    private JLabel titleLabel;

    private JLabel nameJLabel;
    private JTextField nameJTextField;

    private JLabel nickJLabel;
    private JTextField nickJTextField;

    private JLabel pwdJLabel;
    private JPasswordField pwdJTextField;

    private JLabel rePwdJLabel;
    private JPasswordField rePwdJTextField;


    private JButton regBtn;
    /*==================组件==================*/
    /*==================参数==================*/


    /*==================参数==================*/
    /*==================标志==================*/
    boolean canReg = true;

    /*==================标志==================*/


    @Override
    public void init(Map<String, Object> params) {
        // 设置标题
        setTitle("注册");


        handleView();

        // 取消默认关闭事件
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        // 设置大小
        setSize(new Dimension(WIDTH, HEIGHT));
        // 设置不可改变大小
        setResizable(false);
        // 设置居中
        setLocationRelativeTo(null);
        // 设置可见
        setVisible(true);

        handleAction();
    }

    @Override
    public void initComponent() {
        titleLabel = new JLabel("用户注册");
        titleLabel.setFont(FontUtils.TITLE_FONT);

        nameJLabel = new JLabel("用 户 名");
        nameJTextField = new JTextField(20);

        nickJLabel = new JLabel("昵    称");
        nickJTextField = new JTextField(20);

        pwdJLabel = new JLabel("密    码");
        pwdJTextField = new JPasswordField(20);

        rePwdJLabel = new JLabel("确认密码");
        rePwdJTextField = new JPasswordField(20);


        regBtn = new JButton("注    册");
    }

    @Override
    public void initParams() {

    }

    @Override
    public void handleView() {
        initParams();
        initComponent();

        initParams();
        initComponent();

        // 背景容器
        JPanel bgPabel = new JPanel();

        // 外层水平容器
        Box hBox = Box.createHorizontalBox();

        // 外层垂直容器
        Box vBox = Box.createVerticalBox();

        // 标题水平容器
        Box titleBox = Box.createHorizontalBox();

        titleBox.add(titleLabel);

        // 用户名输入框水平容器
        Box nameBox = ComponentUtils.lineInput(nameJLabel, nameJTextField, 15);

        // 昵称输入框水平容器
        Box nickBox = ComponentUtils.lineInput(nickJLabel, nickJTextField, 15);

        // 密码输入框水平容器
        Box pwdBox = ComponentUtils.lineInput(pwdJLabel, pwdJTextField, 15);

        // 确认密码输入框水平容器
        Box rePwdBox = ComponentUtils.lineInput(rePwdJLabel, rePwdJTextField, 15);

        // 注册按钮水平容器
        Box regBox = Box.createHorizontalBox();
        // 使用边界布局使btn占满该行
        JPanel loginBtnPanel = new JPanel(new BorderLayout());

        regBox.add(loginBtnPanel);
        loginBtnPanel.add(regBtn);

        // 添加至外层垂直容器
        vBox.add(Box.createVerticalStrut(30));
        vBox.add(titleBox);
        vBox.add(Box.createVerticalStrut(25));
        vBox.add(nameBox);
        vBox.add(Box.createVerticalStrut(20));
        vBox.add(nickBox);
        vBox.add(Box.createVerticalStrut(20));
        vBox.add(pwdBox);
        vBox.add(Box.createVerticalStrut(20));
        vBox.add(rePwdBox);
        vBox.add(Box.createVerticalStrut(20));
        vBox.add(regBox);
        vBox.add(Box.createVerticalStrut(30));

        // 将垂直容器添加至水平容器
        hBox.add(Box.createHorizontalStrut(30));
        hBox.add(vBox);
        hBox.add(Box.createHorizontalStrut(30));

        // 将水平容器添加至背景容器
        bgPabel.add(hBox);

        // 添加容器至该窗体
        this.add(bgPabel);
    }

    @Override
    public void handleAction() {
        // 点击注册按钮事件
        RegBtnClickEvent();
        // 回车事件
        EnterEvent();
        // 添加窗体事件
        WindowActionEvent();
    }

    /**
     * 窗体事件：
     * 1. 窗口关闭时，跳转登录窗体
     */
    private void WindowActionEvent() {
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                dispose();
                RouterUtils.router(RouterConst.VIEW_LOGIN);
            }
        });
    }

    /**
     * 点击回车按钮事件
     * 1. 调用注册方法
     */
    private void EnterEvent() {
        // 给指定控件添加回车事件
        Component[] components = new Component[] {nameJTextField, nickJTextField, pwdJTextField, rePwdJTextField};
        for (Component component : components) {
            component.addKeyListener(new KeyAdapter() {
                @Override
                public void keyPressed(KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                        reg();
                    }
                }
            });
        }
    }

    /**
     * 点击注册按钮事件
     * 1. 调用注册方法
     */
    private void RegBtnClickEvent() {
        regBtn.addActionListener(e -> {
            reg();
        });
    }

    /**
     * 注册方法:
     *  1. 设置注册标志位为false
     *  2. 设置鼠标图标为加载
     *  3. 开始注册
     *       注册成功:
     *           1. 弹出提示框
     *           2. 销毁该页面
     *           3. 显示登录页
     *       登录失败:
     *           1. 弹出提示框
     *
     *  4. 设置鼠标图标为默认
     *  5. 设置登录标志位为true
     */
    private void reg() {
        if (!this.canReg) {
            return;
        }
        requestBegin();

        String username = nameJTextField.getText();
        String nickname = nickJTextField.getText();
        String password = new String(pwdJTextField.getPassword());
        String rePassword = new String(rePwdJTextField.getPassword());
        if (!preReg(username, nickname, password, rePassword)) {
            requestEnd();
            return;
        }
        // 准备参数
        Map<String, Object> params = new HashMap<String, Object>() {{
            put("username", username);
            put("nickname", username);
            put("password", password);
        }};
        ResultVO<Void> result = (ResultVO<Void>) RequestUtils.sendRequest("user/reg", params);
        if (result.isSuccess()) {
            // 注册成功
            MessageUtils.showMessageDialog(this, "注册成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
            this.dispose();
            RouterUtils.router(RouterConst.VIEW_LOGIN);
        } else {
            // 登录失败
            MessageUtils.showMessageDialog(this, result.getMessage(), "注册失败!", JOptionPane.WARNING_MESSAGE);
        }

        requestEnd();
    }

    /**
     * 请求前的参数验证
     * @param username
     * @param nickname
     * @param password
     * @param rePassword
     * @return
     */
    private boolean preReg(String username, String nickname, String password, String rePassword) {
        if (StringUtils.isBlank(username) || StringUtils.isBlank(nickname) || StringUtils.isBlank(password) || StringUtils.isBlank(rePassword)) {
            MessageUtils.showMessageDialog(this, "请将参数填写完整！", "注册失败", JOptionPane.WARNING_MESSAGE);
            return false;
        }
        if (!password.equals(rePassword)) {
            MessageUtils.showMessageDialog(this, "两次密码输入不一致！", "注册失败", JOptionPane.WARNING_MESSAGE);
            return false;
        }
        return true;
    }

    /**
     * 请求开始
     */
    private void requestBegin() {
        // 设置鼠标图标为加载图标
        this.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        // 设置不能登录
        this.canReg = false;
    }

    /**
     * 请求结束
     */
    private void requestEnd() {
        // 还原鼠标图标
        this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        // 设置可以登录
        this.canReg = true;
    }
}
